// 引入复制文件
import uniCopy from '@/common/js/js_sdk/xb-copy/uni-copy.js';

import store from '@/store';

export default {
	install(Vue) {
		/**
		 * @desc 获取系统配置
		 * @param param  参数名
		 * @param isAll  是否获取全部
		 */
		Vue.prototype.$getSystemConfig = function(param = '', isAll = false) {
			const {
				systemConfig
			} = this.$store.state.init;

			return isAll ? systemConfig : (param ? systemConfig[param] || '' : '');
		}
		/**
		 * @desc 获取用户信息
		 * @param param  参数名
		 */
		Vue.prototype.$getUserInfo = function(param = '') {
			var userInfo = this.$store.state.user.userInfo
			if (userInfo[param] !== undefined) {
				return userInfo[param]
			}
			return userInfo;
		}
		/**
		 * @desc 图片拼接域名
		 * @param {string} path 图片路径
		 * @returns {string} 完整的图片 URL
		 */
		Vue.prototype.$getImageUrl = function(path) {
			const imageUrlPrefix = 'https://qn.mtj.cdydsy.com';
			return imageUrlPrefix + path;
		}
		/**
		 * @desc 是否登录
		 */
		Vue.prototype.$isLogin = function() {
			if (store.state.user.isLogin) {
				return true;
			} else {
				return false;
			}
		}
		/**
		 * @desc 获取转文字
		 * @param name  参数名
		 * @param value  参数值
		 */
		Vue.prototype.$toText = function(name = '', value = '') {
			var toText = this.$store.state.init.toText;
			if (toText[name] === undefined) {
				return ''
			} else {
				return toText[name][value] || '无';
			}
		}
		/**
		 * @desc 获取系统配置
		 * @param param  参数名
		 */
		Vue.prototype.$showToast = function(title, icon = "none", duration = 1500, position = "bottom", mask = false) {
			// 是否可触发
			if (this.$store.state.init.isShowToastClick !== false) { // 可触发
				uni.showToast({
					title: title,
					icon: icon,
					duration: duration,
					position: position,
					mask: mask, // app、微信小程序生效
					fail(res) {}
				})
				// 不可触发
				this.$store.commit('init/setIsShowToastClick', false);
				setTimeout(() => {
					// 可触发
					this.$store.commit('init/setIsShowToastClick', true);
				}, duration)
			}
		}
		/**
		 * @desc 交互模态框
		 * @param param  参数名
		 */
		Vue.prototype.$showModal = function(content, showCancel = false, title = "提示", confirmText = "确认", cancelText =
			"取消") {
			return new Promise((resolve, reject) => {
				uni.showModal({
					title: title,
					content: content,
					showCancel: showCancel,
					confirmColor: '#000000',
					confirmText: confirmText,
					cancelText: cancelText,
					success: (res) => {
						resolve(res);
					},
					fail: (err) => {
						reject(err);
					},
				});
			});
		};
		/**
		 * @desc 错误提示框
		 */
		Vue.prototype.$errorToast = function(msg = '网络错误，请重试') {
			this.$showToast(msg);
		}
		/**
		 * @desc 开发中
		 */
		Vue.prototype.$under = function() {
			this.$showToast('功能开发中，敬请期待', 'none', 800, 'center', true);
		}
		/**
		 * @desc 获取系统信息
		 * @param param  参数名
		 */
		Vue.prototype.$getSystemInfo = function(param = '') {
			var systemInfo = uni.getSystemInfoSync()
			if (systemInfo[param] !== undefined) {
				var res = systemInfo[param]
			} else {
				var res = systemInfo
			}
			return res;
		}
		/**
		 * @desc 存入商品
		 * @param product_id  参数名
		 * @return 最终金额
		 */
		Vue.prototype.$cacheProduct = function(product_id) {
			let product_ids = uni.getStorageSync('interest_product_ids') || [];
			let index = product_ids.indexOf(product_id);
			if (index > -1) {
				product_ids.splice(index, 1)
			}
			product_ids.unshift(product_id)
			uni.setStorageSync('interest_product_ids', product_ids)
		}
		/**
		 * @desc 预览图片
		 * @param arr  图片组
		 * @param index 当前图片
		 */
		Vue.prototype.$previewImages = function(arr, index = 0) {
			// 预览图片
			uni.previewImage({
				current: index,
				urls: arr,
				longPressActions: {
					itemList: ['发送给朋友', '保存图片', '收藏'],
					success: function(data) {},
					fail: function(err) {}
				}
			});
		}
		/**
		 * @desc 文件预览
		 * @param url 文件路径
		 */
		Vue.prototype.$previewFile = function(url) {
			uni.showLoading({
				title: '加载中'
			})
			uni.downloadFile({
				url: url,
				success: function(res) {
					// let filepathss = plus.io.convertLocalFileSystemURL(res.tempFilePath);
					setTimeout(
						() =>
						uni.openDocument({
							filePath: res.tempFilePath,
							showMenu: false,
							success: function() {
								showToast('打开文档成功')
							},
							fail: function() {
								showToast('文档打开失败')
							}
						}),
						1000
					);
				},
				fail: function(res) {
					showToast(res)
				}
			});
		}
		/**
		 * @desc 文件下载
		 * @param arr  文件
		 */
		Vue.prototype.$downloadFile = function(file, file_type = 1) {
			uni.showLoading({
				title: '下载中...'
			})
			uni.downloadFile({
				url: file,
				success: (res) => {
					if (res.statusCode === 200) {
						if (file_type == 1) { // 图片保存至相册
							uni.saveImageToPhotosAlbum({
								// 然后调用这个方法
								filePath: res.tempFilePath,
								success: (res) => {
									uni.hideLoading()
									showToast('已保存')
								}
							})
						} else { // 文件保存
							var name = '1111.doc';
							const downloadTask = plus.downloader.createDownload(file, //文件的下载地址
								{
									filename: 'file://storage/emulated/0/ydyxyw/' +
										name, //服务器 app 的下载地址
								},
								function(downloadResult, status) {
									// uni.hideLoading();
									if (status == 200) {
										//downloadResult.filename是文件在保存在本地的相对路径，使用下面的API可转为平台绝对路径
										let fileSaveUrl = plus.io.convertLocalFileSystemURL(
											downloadResult
											.filename);
										plus.runtime.openFile(downloadResult.filename); //选择软件打开文件
										uni.showToast({
											icon: 'none',
											mask: true,
											title: `文件已保存`, //保存路径
											duration: 3000,
										});
									} else { //下载失败
										plus.downloader.clear(); //清除下载任务
									}
								}
							);
							downloadTask.start(); //执行下载
							// uni.saveFile({ //文件保存到本地
							// 	tempFilePath: res.tempFilePath, //临时路径
							// 	success: function(res) {
							// 		console.log("下载成功" + res.savedFilePath)
							// 		console.log(JSON.stringify(res))
							// 		uni.hideLoading()
							// 		showToast('已保存')
							// 		uni.openDocument({
							// 			fileType: 'docx',
							// 			filePath: res.savedFilePath,
							// 			success: function(res) {
							// 				console.log('打开文档成功');
							// 			}
							// 		});
							// 	}
							// });
						}
					}
				},
				fail: (ex) => {
					uni.hideLoading()
					showToast('保存失败，请稍后重试')
				}
			});
		}
		/**
		 * 微信客服
		 */
		Vue.prototype.$customerService = function(sceneStr) {
			if (!Vue.prototype.$isLogin()) {
				setTimeout(() => {
					Vue.prototype.$navigateTo('/subPackages/login/wxAuth');
				}, 500)
				return false;
			}
			let sweixin = null
			plus.share.getServices(res => {
				sweixin = res.find(i => i.id === 'weixin')
				if (sweixin) {
					sweixin.openCustomerServiceChat({
						corpid: 'ww8542a6aca8653e04', // 企业ID
						url: 'https://work.weixin.qq.com/kfid/kfccd415c6aed8d47cd', // 客服链接
					})
				} else {
					// plus.nativeUI.alert('当前环境不支持微信操作')
					uni.showToast({
						title: "当前环境不支持微信操作",
						icon: 'error'
					})
				}
			}, function() {
				uni.showToast({
					title: "获取服务失败，不支持该操作。" + JSON.stringify(e),
					icon: 'error'
				})
			})
		}
		/**
		 * @desc 全局小程序分享
		 * @param title 标题
		 * @param path 路径
		 * @param imageUrl 封面图
		 * @param desc 描述
		 * @param content 内容
		 */
		Vue.prototype.$onShare = function(title = '美条街', path = '/pages/index/index', params = '', imageUrl = '',
			desc = '', content = '') {
			params = params ? '?' + params : ''; // 默认第一个参数
			if (Vue.prototype.$isLogin()) { // 已登陆
				var userInfo = Vue.prototype.$getUserInfo();
				if (params) { // 有参数
					params = params + '&';
				} else {
					params = '?'; // 默认第一个参数
				}
				// 用户id
				params += 'parent_id=' + userInfo.id;
				if (userInfo.institutionagent) { // 机构代理
					// 机构代理id
					params += '&institution_agent_id=' + userInfo.institutionagent.id;
				}
			}
			return {
				title: store.state.init.spreadInfo.spread_name || title,
				path: path + params,
				imageUrl: imageUrl,
				desc: desc,
				content: content,
				success(res) {
					Vue.prototype.$showToast('分享成功');
				},
				fail(res) {
					Vue.prototype.$showToast('分享失败');
				}
			}
		}
		/**
		 * @desc 全局小程序分享朋友圈、收藏
		 * @param title 标题
		 * @param path 路径
		 * @param imageUrl 封面图
		 * @param desc 描述
		 * @param content 内容
		 */
		Vue.prototype.$onShareTimeline = function(title = '美条街', path = '/pages/index/index', params = '', imageUrl =
			'',
			desc = '', content = '') {
			if (Vue.prototype.$isLogin()) { // 已登陆
				var userInfo = Vue.prototype.$getUserInfo();
				if (params) { // 有参数
					params = params + '&';
				} else {
					params = ''; // 默认第一个参数
				}
				// 用户id
				params += 'parent_id=' + userInfo.id;
				if (userInfo.institutionagent) { // 机构代理
					// 机构代理id
					params += '&institution_agent_id=' + userInfo.institutionagent.id;
				}
			}
			return {
				title: store.state.init.spreadInfo.spread_name || title,
				path: path,
				imageUrl: imageUrl,
				query: params,
			}
		}
		/**
		 * 处理二维码参数
		 */
		Vue.prototype.$getQrCodeParams = function(sceneStr) {
			var query = {};
			if (sceneStr) {
				// 获取二维码携带的参数
				var scene = decodeURIComponent(sceneStr)
				scene.split('&').forEach((item, index) => {
					// 单个参数
					var paramsArr = item.split('=')
					query[paramsArr[0]] = paramsArr[1];
				})
			}
			return query;
		}
		/**
		 * @desc 是否是微信浏览器
		 */
		Vue.prototype.$isWxWeb = function() {
			var res = false;
			// #ifdef H5
			let ua = navigator.userAgent.toLowerCase();
			if (ua.match(/MicroMessenger/i) == "micromessenger") {
				res = true;
			} else {
				res = false;
			}
			// #endif
			return res;
		}
		/**
		 * @desc 去登陆
		 */
		Vue.prototype.$toLogin = function() {
			// 当前页面需登录
			// 跳转微信小程序登录页
			uni.navigateTo({
				url: '/subPackages/login/wxAuth'
			})
		}
		/**
		 * @desc 返回长度验证码
		 */
		Vue.prototype.$getRandomCode = function(length = 6) {
			let res = '';
			for (var i = 0; i < length; i++) res += Math.floor(Math.random() * 10);
			return res;
		}
		/**
		 * @desc 复制文本
		 */
		Vue.prototype.$copyText = function(value) {
			uniCopy({
				content: value,
				success: (res) => {
					Vue.prototype.$showToast('已复制到粘贴面板');
				},
				error: (e) => {
					Vue.prototype.$showToast('复制失败，请重试');
				}
			})
		}
		/**
		 * @desc 长震动
		 */
		Vue.prototype.$vibrateLong = function() {
			uni.vibrateLong({
				success: function() {}
			});
		}
		/**
		 * @desc 系统提示音
		 */
		Vue.prototype.$messageSound = function() {
			let main = plus.android.runtimeMainActivity();
			let RingtoneManager = plus.android.importClass("android.media.RingtoneManager");
			let uri = RingtoneManager.getActualDefaultRingtoneUri(main, RingtoneManager
				.TYPE_NOTIFICATION);
			let MediaPlayer = plus.android.importClass("android.media.MediaPlayer");
			let player = MediaPlayer.create(main, uri);
			player.setLooping(false);
			player.prepare();
			player.start();
		}

		/**
		 * @desc 区分平台（ios/Android/小程序）
		 */
		Vue.prototype.$distinguishPlatform = function() {
			let port = uni.getSystemInfoSync().platform
			switch (port) {
				case 'android':
					break;
				case 'ios':
					break;
				case 'applet':
					break;
			}
		}
		/**
		 * @desc 设置缓存
		 * @param { string } key - 缓存键名
		 * @param { any } data - 缓存数据，可以是任意类型的数据
		 * @param { number } expireTime - 过期时间
		 */
		Vue.prototype.$setCache = function(key, data, expireTime = 0) {
			// 保存数据到缓存
			uni.setStorageSync(key, data);
			// 判断是否设置了过期时间
			if (expireTime > 0) {
				// 计算过期时间点（以当前时间为基准）
				const expireTimeStamp = Date.now() + expireTime * 1000;
				// 保存过期时间到缓存
				uni.setStorageSync(`${key}_expire`, expireTimeStamp);
			}
		}

		/**
		 * @desc 获取缓存
		 * @param { string } key - 缓存键名
		 * @returns { any } - 缓存数据，如果不存在则返回 undefined
		 */
		Vue.prototype.$getCache = function(key) {
			return uni.getStorageSync(key);
		}
		/**
		 * @desc 节流
		 * @param { Function } fn - 函数
		 * @returns { number } delay- 等待时间
		 */
		Vue.prototype.$throttle = function(fn, delay) {
			let timer = null;
			return function(...args) {
				const context = this;
				if (!timer) {
					timer = setTimeout(() => {
						fn.apply(context, args);
						timer = null;
					}, delay);
				}
			};
		};
		/**
		 * @desc 防抖
		 * @param { Function } fn - 函数
		 * @returns { number } delay- 等待时间
		 */
		Vue.prototype.$debounce = function(fn, delay) {
			let timer = null;
			return function() {
				if (timer !== null) {
					clearTimeout(timer)
				}
				timer = setTimeout(() => {
					fn.call(this)
				}, delay)
			};
		}
		// 深拷贝
		Vue.prototype.$deepClone = function deepClone(obj) {
			// 判断传入的是否是对象或者数组，如果不是直接返回
			if (typeof obj !== 'object' || obj === null) {
				return obj;
			}
			let result;
			// 判断是数组还是普通对象，创建对应的类型来接收拷贝后的值
			if (Array.isArray(obj)) {
				result = [];
			} else {
				result = {};
			}
			for (let key in obj) {
				// 递归调用deepClone来处理对象或数组中的每一项
				result[key] = deepClone(obj[key]);
			}
			return result;
		}
		/**
		 * 本算法来源于简书开源代码，详见：https://www.jianshu.com/p/fdbf293d0a85
		 * 全局唯一标识符（uuid，Globally Unique Identifier）,也称作 uuid(Universally Unique IDentifier) 
		 * 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题
		 * 最可能的情况是左滑删除item或者对某条信息流"不喜欢"并去掉它的时候,会导致组件内的数据可能出现错乱
		 * v-for的时候,推荐使用后端返回的id而不是循环的index
		 * @param {Number} len uuid的长度
		 * @param {Boolean} firstU 将返回的首字母置为"u"
		 * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
		 */
		Vue.prototype.$guid = function guid(len = 32, firstU = true, radix = null) {
			let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
			let uuid = [];
			radix = radix || chars.length;

			if (len) {
				// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
				for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
			} else {
				let r;
				// rfc4122标准要求返回的uuid中,某些位为固定的字符
				uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
				uuid[14] = '4';

				for (let i = 0; i < 36; i++) {
					if (!uuid[i]) {
						r = 0 | Math.random() * 16;
						uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
					}
				}
			}
			// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class
			if (firstU) {
				uuid.shift();
				return 'u' + uuid.join('');
			} else {
				return uuid.join('');
			}
		}
	}
}